# -*- coding: utf-8 -*-
"""
Author:duan
Date: 2021/3/15 22:36
"""
from oslo_config import cfg
import oslo_messaging
import time


class ServerControlEndpoint(object):

    def __init__(self, server):
        self.server = server

    def stop(self, ctx):
        if self.server:
            self.server.stop()


class AddEndpoint(object):

    def add(self, ctx, a, b):
        print('revice message')
        return a + b


# 从配置文件中加载transport_url。在openstack中，账号、密码、端口号等都是从配置文件中读取，支持可配置的。
# 配置文件的内容通过oslo_config库读取。
opts = [
    cfg.StrOpt('url', default='0.0.0.0'),
]

CONF = cfg.CONF
CONF.register_opts(opts)

CONF(default_config_files=['my.conf'])

# transport_url是指定实现RPC的底层技术，可以使rabbitmq，也可以是别的技术
# 从my.conf文件中读取到该URL。
transport_url = CONF.url

transport = oslo_messaging.get_transport(cfg.CONF, transport_url)

# target用来指定该rpc server监听在哪些队列上。
# target指定了2个参数：topic和server。
target = oslo_messaging.Target(topic='test', server='server1')

# 可供别人调用的方法类
endpoints = [
    ServerControlEndpoint(None),
    AddEndpoint(),
]

# 创建Server对象时，需要指定Transport、Target和一组endpoint
server = oslo_messaging.get_rpc_server(transport, target, endpoints)
try:
    server.start()
    print('The Server!')
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    print("Stopping server")

server.stop()
